2023/12/233205字符

function

原生函数

  • Array() 不要求必须带 new 关键字,与 new Array() 效果一样
var a = Array(3);
var b = [undefined, undefined, undefined];
var c = [];
c.length = 3;
console.log(a, b, c);
// chrome: --> a: [empty × 3]  b: [undefined, undefined, undefined]  c: [empty × 3]
// firefox: --> a: [undefined, undefined, undefined]  b: [undefined, undefined, undefined]  c: [undefined, undefined, undefined]

Object() Function() RegExp() 尽量不要使用 在实际情况下没有必要使用 new Object() 创建对象,因为这样无法像常量形式那样一次设定多个属性,而必须逐一设定

作用域带来的影响

function foo(){
    function bar(a){
        i = 3;  // 修改for循环所属作用域中的i
        console.log(a + i);
    }
    for(var i = 0; i < 10; i ++){
        // bar(i * 2);  // 作死操作,无限循环
    }
}
foo();

“隐藏”作用域中的变量和函数所带来的的另一个好处,是可以规避同名标识符之间的冲突。冲突会导致变量的值被意外赋值。

立即函数表达式

var obj1 = {
    a: 2
};
(function IIFE(global){  // IIFE() 把他们当作函数调用传递进去
    var a = 3;
    console.log(a);  //--> 3
    console.log(global.a);  //--> 2
})(obj1);


var obj2 = {
    a: 2
};
(function IIFE(def){
    def(obj2);
})(function def(global){
    var a = 3;
    console.log(a);  //--> 3
    console.log(global.a);  //--> 2
})

倒置代码的运行顺序,将需要运行的函数放在第二位。这种模式在UMD项目中被广泛使用,尽管这种模式略显冗长,但有些人它更容易理解。

作用域

foo();  // TypeError
bar();  // ReferenceError
var foo = function bar(){}

// 代码提升后,会被理解为以下形式:
var foo;  // 变量 声明被提升
foo();  // 发生类型错误
bar();  // 函数名称作为函数体(作用域内)的本地变量
foo = function bar(){
    // 变量赋值被保留在原地
}

闭包

  • 闭包的形式:
function foo() {
    var a = 2;
    function baz(){
        console.log(a);  //--> 2
    }
    bar(baz);
}
function bar(fn){
    fn()
}
foo();

function wait(message){
    setTimeout(function timer(){
        console.log(message);
    }, 1000);
}
wait('helo');

有没有发现,函数内的定时器其实形成了闭包。wait() 执行1000毫秒后,它内部作用域并不会消失,timer函数依然保有wait() 作用域的闭包

模块化

function coolModule(){
    var str = 'cool';
    var num = 1234;
    function outputStr(){
        console.log(str);
    }
    function outputNum(){
        console.log(num);
    }
    return {outputStr, outputNum};
}
var foo = coolModule();
foo.outputStr();  //--> cool

var foo = (function coolModule(){
    var str = 'cool';
    var num = 1234;
    function outputStr(){
        console.log(str);
    }
    function outputNum(){
        console.log(num);
    }
    return {outputStr, outputNum};
})();
foo.outputStr();  //--> cool